
#include <iostream>
#include <ostream>
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

// 前序遍历
void preOrder(TreeNode *root) {
    // 最小子问题
    if (root == nullptr) return;
    // 遍历打印根节点
    std::cout << root->val << std::endl;
    // 遍历左子树
    preOrder(root->left);
    // 遍历右子树
    preOrder(root->right);
}

// 中序遍历
void inOrder(TreeNode *root) {
    // 最小子问题
    if (root == nullptr) return;
    // 遍历左子树
    inOrder(root->left);
    // 遍历打印根节点
    std::cout << root->val << std::endl;
    // 遍历右子树
    inOrder(root->right);
}

// 后序遍历
void postOrder(TreeNode *root) {
    // 最小子问题
    if (root == nullptr) return;
    // 遍历左子树
    postOrder(root->left);
    // 遍历右子树
    postOrder(root->right);
    // 遍历打印根节点
    std::cout << root->val << std::endl;
}

int main() {
    TreeNode node5(7, nullptr, nullptr);
    TreeNode node4(11, nullptr, nullptr);
    TreeNode node3(23, nullptr, nullptr);
    TreeNode node2(9, nullptr, &node5);
    TreeNode node1(8, &node3, &node4);
    TreeNode root(10, &node1, &node2);

    preOrder(&root);

    return 0;
}

